Adding some more judges, here and there.
[and.git] / ICPC Live Archive / 3928 - Ballroom lights / help / gomox.ar-pap-2010-d9b17e5cb110 / tpb / doc / labyrinth.tex
blobaeee5f6f910464e2f90ee116f19330850a3e5997
1 \section{11200 - Sapitaur's labyrinth}
2 \textbf{Problema:}
3 Dada una grilla de paredes diagonales, determinar cu\'antos caminos hay desde
4 el borde superior de la grilla hasta el borde inferior.
6 \subsection{Resoluci\'on}
8 La entrada es una matriz de $n \times m$, que en la
9 posici\'on $(i,j)$ indica si la pared es una diagonal
10 ascendente (\texttt{/}) o descendente (\texttt{$\backslash$}).
11 Consideramos el grafo impl\'icito asociado a esta matriz.
12 El grafo en cuesti\'on tiene $(n + 1) \times m$ nodos, uno
13 por cada segmento horizontal de la grilla. Dos nodos
14 son adyacentes si, y solo si, est\'an en celdas contiguas y se puede
15 llegar de uno al otro sin cruzar una pared (y sin salir
16 de la grilla).
18 \begin{figure}[H]
19 \centering
20 \includegraphics[scale=0.65]{./figuras/laberinto.pdf}
21 \caption{Grilla con paredes diagonales y el grafo asociado a esta grilla}
22 \label{fig:laberinto}
23 \end{figure}
25 El problema que se quiere resolver es entonces determinar la
26 cantidad de caminos
27 simples que empiezan en alguno de los nodos de la
28 primera fila ($0, 1, ..., m - 1$) y
29 terminan en alguno de los nodos de la \'ultima fila
30 ($n m, n m + 1, ..., n m + m - 1$).
32 Los grafos asociados a este tipo de matrices cumplen las siguientes propiedades:
34 \begin{itemize}
35 \item Cada nodo tiene grado a lo sumo 2. Esto
36 es porque un segmento horizontal de la grilla puede
37 tener a lo sumo un vecino por la celda superior
38 (como el $0$ respecto del $4$ o la pareja $6$--$7$ en
39 la Fig.~\ref{fig:laberinto})
40 y a lo sumo un vecino por la celda inferior (como el $8$ respecto del $4$ o la pareja $1$--$2$). Notar que esto es cierto porque en
41 {\em todas} las celdas hay una pared.
43 \item Los nodos de la primera fila y los de la \'ultima
44 fila tienen grado a lo sumo 1. Los nodos de la primera fila no pueden
45 tener un vecino por la fila superior, y algo an\'alogo ocurre para los de la \'ultima.
47 \item Si bien el grafo puede tener ciclos,
48 no puede haber ciclos alcanzables desde los
49 nodos de la primera fila. M\'as a\'un, desde
50 los nodos de la primera fila s\'olo puede
51 construirse un \'unico camino simple maximal.
52 Por inducci\'on en la longitud del camino, es
53 f\'acil ver que todo camino simple
54 que empiece en un nodo $v_1$ de la primera fila
55 es o bien $v_1$ (si $v_1$ tiene grado 0)
56 o bien de la forma
57 $v_1, ..., v_k$ donde $v_1$ tiene grado 1,
58 $v_2, ..., v_{k-1}$ tienen grado 2
59 y $v_k$ tiene grado 1 \'o 2.
60 Uno de los vecinos de $v_k$ es $v_{k-1}$.
61 Si $v_k$ tiene grado 1, no tiene m\'as vecinos,
62 y por lo tanto este es
63 el \'unico camino simple maximal que se
64 puede construir a partir de $v_1$.
65 Si $v_k$ tiene grado 2, tiene un segundo vecino $v_{k+1}$.
66 Esta es la \'unica manera de extender el camino.
67 Adem\'as, extendi\'endolo de esta manera
68 no se forma un ciclo, porque $v_{k+1}$ no puede
69 ser ninguno de los nodos $v_1, ..., v_{k-1}$
70 (suponiendo que fuera alguno de dichos nodos, $v_i$,
71 se concluye que $v_i$ deber\'ia tener grado mayor al
72 que ya se le conoc\'ia).
73 \end{itemize}
75 Teniendo en cuenta la \'ultima propiedad, el algoritmo utilizado
76 visita cada uno de los nodos de la primera fila y construye
77 el \'unico camino simple maximal que empieza en ese nodo.
78 El camino encontrado se considera v\'alido si termina en
79 alguno de los nodos de la \'ultima fila. Dado que nunca
80 hay bifurcaciones, no es necesario utilizar una estructura
81 de datos auxiliar como una pila o una cola
82 (puede pensarse indistintamente que el algoritmo usado es
83 DFS o BFS).
85 Como en cualquier implementaci\'on de BFS, el algoritmo
86 visita una 'unica vez cada nodo. Para garantizar esto, se mantiene
87 una estructura (representada con una matriz de booleanos del mismo
88 tama\~no que la matriz de entrada) en la que se marcan aquellos
89 nodos que ya fueron visitados.
91 Dado que los potenciales ciclos del grafo no son alcanzables desde
92 los nodos asociados a la primera fila de la matriz, el algoritmo
93 se podr\'ia implementar sin necesidad de mantener esta estructura
94 auxiliar. Manteni\'endola, se evita recorrer dos veces los caminos
95 que empiezan y terminan en nodos de la fila superior, lo cual es
96 potencialmente mejor pero no cambia la complejidad.
98 El grafo construido tiene $O(n m)$ nodos, y a lo sumo dos ejes
99 incidentes en cada nodo, de donde resulta que la complejidad del algoritmo
100 es $O(n m)$, lo cual es lineal en el tama\~no de la entrada.
102 \subsection{Implementación}
103 \noindent
104 \ttfamily
105 \shorthandoff{"}\\
106 \hlstd{}\hlline{\ 1\ }\hldir{\#include\ $<$iostream$>$}\\
107 \hlline{\ 2\ }\hlstd{}\hldir{\#include\ $<$vector$>$}\\
108 \hlline{\ 3\ }\hlstd{}\hldir{\#include\ $<$cassert$>$}\\
109 \hlline{\ 4\ }\hlstd{}\hldir{\#include\ $<$cstdio$>$}\\
110 \hlline{\ 5\ }\hlstd{}\\
111 \hlline{\ 6\ }\hlkwa{using\ namespace\ }\hlstd{std}\hlsym{;}\\
112 \hlline{\ 7\ }\hlstd{}\\
113 \hlline{\ 8\ }\hldir{\#define\ forsn(i,\ s,\ n)\ for\ (int\ i\ =\ (s);\ i\ $<$\ (n);\ i++)}\\
114 \hlline{\ 9\ }\hlstd{}\hldir{\#define\ forn(i,\ n)\ forsn\ (i,\ 0,\ n)}\\
115 \hlline{10\ }\hlstd{}\\
116 \hlline{11\ }\hlkwc{typedef\ }\hlstd{vector}\hlsym{$<$}\hlstd{}\hlkwb{bool}\hlstd{}\hlsym{$>$\ }\hlstd{vbool}\hlsym{;}\\
117 \hlline{12\ }\hlstd{}\hlkwc{typedef\ }\hlstd{vector}\hlsym{$<$}\hlstd{vbool}\hlsym{$>$\ }\hlstd{vvbool}\hlsym{;}\\
118 \hlline{13\ }\hlstd{}\\
119 \hlline{14\ }\hlkwc{typedef\ }\hlstd{}\hlkwb{int\ }\hlstd{Node}\hlsym{;}\\
120 \hlline{15\ }\hlstd{}\hlkwb{int\ }\hlstd{rows}\hlsym{;}\\
121 \hlline{16\ }\hlstd{}\hlkwb{int\ }\hlstd{cols}\hlsym{;}\\
122 \hlline{17\ }\hlstd{vvbool\ mapa}\hlsym{;}\\
123 \hlline{18\ }\hlstd{}\\
124 \hlline{19\ }\hldir{\#define\ node(r,\ c)}\hlstd{\ \ }\hldir{((r)\ $<$$<$\ 12\ \textbar \ (c))}\\
125 \hlline{20\ }\hlstd{}\hldir{\#define\ node\textunderscore row(v)}\hlstd{\ \ }\hldir{((v)\ $>$$>$\ 12)}\\
126 \hlline{21\ }\hlstd{}\hldir{\#define\ node\textunderscore col(v)}\hlstd{\ \ }\hldir{((v)\ \&\ 0xfff)}\\
127 \hlline{22\ }\hlstd{}\\
128 \hlline{23\ }\hldir{\#define\ NONE}\hlstd{\ \ \ }\hldir{0xffffffff}\\
129 \hlline{24\ }\hlstd{\\
130 \hlline{25\ }Node\ }\hlkwd{vecino}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{bool\ }\hlstd{ns}\hlsym{,\ }\hlstd{Node\ v}\hlsym{)\ \{}\\
131 \hlline{26\ }\hlstd{}\hldir{\#define\ sig(x)\ ((x)\ ?\ 1\ :\ {-}1)}\\
132 \hlline{27\ }\hlstd{\ }\hlkwb{const\ int\ }\hlstd{r\ }\hlsym{=\ }\hlstd{}\hlkwd{node\textunderscore row}\hlstd{}\hlsym{(}\hlstd{v}\hlsym{)\ {-}\ }\hlstd{ns}\hlsym{,\ }\hlstd{c\ }\hlsym{=\ }\hlstd{}\hlkwd{node\textunderscore col}\hlstd{}\hlsym{(}\hlstd{v}\hlsym{);}\\
133 \hlline{28\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{r\ }\hlsym{$<$\ }\hlstd{}\hlnum{0\ }\hlstd{}\hlsym{\textbar \textbar \ }\hlstd{r\ }\hlsym{$>$=\ }\hlstd{rows}\hlsym{)\ }\hlstd{}\hlkwa{return\ }\hlstd{NONE}\hlsym{;}\\
134 \hlline{29\ }\hlstd{\ }\hlkwb{const\ int\ }\hlstd{cc\ }\hlsym{=\ }\hlstd{c\ }\hlsym{+\ }\hlstd{}\hlkwd{sig}\hlstd{}\hlsym{(}\hlstd{ns\ \textasciicircum \ mapa}\hlsym{{[}}\hlstd{r}\hlsym{{]}{[}}\hlstd{c}\hlsym{{]});}\\
135 \hlline{30\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{cc\ }\hlsym{$<$\ }\hlstd{}\hlnum{0\ }\hlstd{}\hlsym{\textbar \textbar \ }\hlstd{cc\ }\hlsym{$>$=\ }\hlstd{cols}\hlsym{)\ }\hlstd{}\hlkwa{return\ }\hlstd{NONE}\hlsym{;}\\
136 \hlline{31\ }\hlstd{\ }\hlkwb{const\ int\ }\hlstd{rr\ }\hlsym{=\ }\hlstd{}\hlkwd{node\textunderscore row}\hlstd{}\hlsym{(}\hlstd{v}\hlsym{)\ +\ }\hlstd{}\hlkwd{sig}\hlstd{}\hlsym{(}\hlstd{ns}\hlsym{)\ {*}\ {-}!(}\hlstd{mapa}\hlsym{{[}}\hlstd{r}\hlsym{{]}{[}}\hlstd{c}\hlsym{{]}\ }\hlstd{\textasciicircum \ mapa}\hlsym{{[}}\hlstd{r}\hlsym{{]}{[}}\hlstd{cc}\hlsym{{]});}\\
137 \hlline{32\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{rr\ }\hlsym{$<$\ }\hlstd{}\hlnum{0\ }\hlstd{}\hlsym{\textbar \textbar \ }\hlstd{rr\ }\hlsym{$>$\ }\hlstd{rows}\hlsym{)\ }\hlstd{}\hlkwa{return\ }\hlstd{NONE}\hlsym{;}\\
138 \hlline{33\ }\hlstd{\ }\hlkwa{return\ }\hlstd{}\hlkwd{node}\hlstd{}\hlsym{(}\hlstd{rr}\hlsym{,\ }\hlstd{cc}\hlsym{);}\\
139 \hlline{34\ }\hlstd{}\hlsym{\}}\\
140 \hlline{35\ }\hlstd{}\\
141 \hlline{36\ }\hlkwb{int\ }\hlstd{}\hlkwd{resolver}\hlstd{}\hlsym{()\ \{}\\
142 \hlline{37\ }\hlstd{}\hldir{\#define\ marcado(v)\ (\textunderscore marcas{[}node\textunderscore row(v){]}{[}node\textunderscore col(v){]})}\\
143 \hlline{38\ }\hlstd{}\hldir{\#define\ marcar(v)\ (\textunderscore marcas{[}node\textunderscore row(v){]}{[}node\textunderscore col(v){]}\ =\ true)}\\
144 \hlline{39\ }\hlstd{\ }\hlkwb{int\ }\hlstd{cant\ }\hlsym{=\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
145 \hlline{40\ }\hlstd{\ vvbool\ }\hlkwd{\textunderscore marcas}\hlstd{}\hlsym{(}\hlstd{rows\ }\hlsym{+\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{,\ }\hlstd{}\hlkwd{vbool}\hlstd{}\hlsym{(}\hlstd{cols}\hlsym{,\ }\hlstd{}\hlkwa{false}\hlstd{}\hlsym{));}\\
146 \hlline{41\ }\hlstd{\ }\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{c}\hlsym{,\ }\hlstd{cols}\hlsym{)\ \{}\\
147 \hlline{42\ }\hlstd{}\hlstd{\ \ }\hlstd{Node\ v\ }\hlsym{=\ }\hlstd{}\hlkwd{node}\hlstd{}\hlsym{(}\hlstd{}\hlnum{0}\hlstd{}\hlsym{,\ }\hlstd{c}\hlsym{);}\\
148 \hlline{43\ }\hlstd{\\
149 \hlline{44\ }}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{}\hlkwd{marcado}\hlstd{}\hlsym{(}\hlstd{v}\hlsym{))\ }\hlstd{}\hlkwa{continue}\hlstd{}\hlsym{;}\\
150 \hlline{45\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{marcar}\hlstd{}\hlsym{(}\hlstd{v}\hlsym{);}\\
151 \hlline{46\ }\hlstd{\\
152 \hlline{47\ }}\hlstd{\ \ }\hlstd{}\hlkwa{for\ }\hlstd{}\hlsym{(;;)\ \{}\\
153 \hlline{48\ }\hlstd{}\hlstd{\ \ \ }\hlstd{Node\ w\ }\hlsym{=\ }\hlstd{NONE}\hlsym{;}\\
154 \hlline{49\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{direction}\hlsym{,\ }\hlstd{}\hlnum{2}\hlstd{}\hlsym{)\ \{}\\
155 \hlline{50\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{Node\ vv\ }\hlsym{=\ }\hlstd{}\hlkwd{vecino}\hlstd{}\hlsym{(}\hlstd{direction}\hlsym{,\ }\hlstd{v}\hlsym{);}\\
156 \hlline{51\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{vv\ }\hlsym{==\ }\hlstd{NONE\ }\hlsym{\textbar \textbar \ }\hlstd{}\hlkwd{marcado}\hlstd{}\hlsym{(}\hlstd{vv}\hlsym{))\ }\hlstd{}\hlkwa{continue}\hlstd{}\hlsym{;}\\
157 \hlline{52\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{assert}\hlstd{}\hlsym{(}\hlstd{w\ }\hlsym{==\ }\hlstd{NONE}\hlsym{);}\\
158 \hlline{53\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{w\ }\hlsym{=\ }\hlstd{vv}\hlsym{;}\\
159 \hlline{54\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlsym{\}}\\
160 \hlline{55\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{w\ }\hlsym{==\ }\hlstd{NONE}\hlsym{)\ }\hlstd{}\hlkwa{break}\hlstd{}\hlsym{;}\\
161 \hlline{56\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{}\hlkwd{node\textunderscore row}\hlstd{}\hlsym{(}\hlstd{w}\hlsym{)\ ==\ }\hlstd{rows}\hlsym{)\ \{}\\
162 \hlline{57\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{cant}\hlsym{++;}\\
163 \hlline{58\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwa{break}\hlstd{}\hlsym{;}\\
164 \hlline{59\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlsym{\}}\\
165 \hlline{60\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwd{marcar}\hlstd{}\hlsym{(}\hlstd{w}\hlsym{);}\\
166 \hlline{61\ }\hlstd{}\hlstd{\ \ \ }\hlstd{v\ }\hlsym{=\ }\hlstd{w}\hlsym{;}\\
167 \hlline{62\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
168 \hlline{63\ }\hlstd{\ }\hlsym{\}}\\
169 \hlline{64\ }\hlstd{\ }\hlkwa{return\ }\hlstd{cant}\hlsym{;}\\
170 \hlline{65\ }\hlstd{}\hlsym{\}}\\
171 \hlline{66\ }\hlstd{}\\
172 \hlline{67\ }\hlkwb{int\ }\hlstd{}\hlkwd{main}\hlstd{}\hlsym{()\ \{}\\
173 \hlline{68\ }\hlstd{\ }\hlkwb{int\ }\hlstd{ncases}\hlsym{;}\\
174 \hlline{69\ }\hlstd{\ cin\ }\hlsym{$>$$>$\ }\hlstd{ncases}\hlsym{;}\\
175 \hlline{70\ }\hlstd{\ \\
176 \hlline{71\ }\ }\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{ncases}\hlsym{)\ \{}\\
177 \hlline{72\ }\hlstd{}\hlstd{\ \ }\hlstd{cin\ }\hlsym{$>$$>$\ }\hlstd{cols\ }\hlsym{$>$$>$\ }\hlstd{rows}\hlsym{;}\\
178 \hlline{73\ }\hlstd{}\hlstd{\ \ }\hlstd{mapa\ }\hlsym{=\ }\hlstd{}\hlkwd{vvbool}\hlstd{}\hlsym{(}\hlstd{rows}\hlsym{,\ }\hlstd{}\hlkwd{vbool}\hlstd{}\hlsym{(}\hlstd{cols}\hlsym{));}\\
179 \hlline{74\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{r}\hlsym{,\ }\hlstd{rows}\hlsym{)\ \{}\\
180 \hlline{75\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{c}\hlsym{,\ }\hlstd{cols}\hlsym{)\ \{}\\
181 \hlline{76\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{char\ }\hlstd{mapa\textunderscore rc}\hlsym{;}\\
182 \hlline{77\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{cin\ }\hlsym{$>$$>$\ }\hlstd{mapa\textunderscore rc}\hlsym{;}\\
183 \hlline{78\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{mapa}\hlsym{{[}}\hlstd{r}\hlsym{{]}{[}}\hlstd{c}\hlsym{{]}\ =\ (}\hlstd{mapa\textunderscore rc\ }\hlsym{==\ }\hlstd{}\hlstr{`}\hlesc{$\backslash$$\backslash$}\hlstr{`}\hlstd{}\hlsym{);}\\
184 \hlline{79\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlsym{\}}\\
185 \hlline{80\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
186 \hlline{81\ }\hlstd{\\
187 \hlline{82\ }}\hlstd{\ \ }\hlstd{cout\ }\hlsym{$<$$<$\ }\hlstd{}\hlkwd{resolver}\hlstd{}\hlsym{()\ $<$$<$\ }\hlstd{endl}\hlsym{;}\\
188 \hlline{83\ }\hlstd{\ }\hlsym{\}}\\
189 \hlline{84\ }\hlstd{\\
190 \hlline{85\ }\ }\hlkwa{return\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
191 \hlline{86\ }\hlstd{}\hlsym{\}}\hlstd{}\\
192 \mbox{}
193 \normalfont
194 \shorthandon{"}